using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public enum 节点类型_A星
{
    地面,水面,底层建筑,绝对障碍,门
}

public class 寻路节点_A星
{
    public float 寻路消耗;
    public float 距离起点的距离;
    public float 距离终点的距离;

    public 寻路节点_A星 父对象;

    public Vector2Int 坐标;

    public 节点类型_A星 格子类型;
    public 房间坐标类 所属房间;//等于空是 说明没有所属房间

    public 寻路节点_A星(Vector2Int 坐标, 节点类型_A星 类型)
    {
        this.坐标 = 坐标;
        this.格子类型 = 类型;
    }

    public void 清空寻路消耗参数()
    {
        寻路消耗 = 0;
        距离起点的距离 = 0;
        距离终点的距离 = 0;
    }

    public void 修改寻路参数(float 距离起点的距离,float 距离终点的距离)
    {
        this.距离起点的距离 = 距离起点的距离;
        this.距离终点的距离 = 距离终点的距离;
        寻路消耗 = 距离起点的距离 + 距离终点的距离;
    }
}

public class 房间坐标类
{
    public List<Vector2Int> 地面坐标 = new List<Vector2Int>();
    public List<Vector2Int> 墙体坐标 = new List<Vector2Int>();

    public 节点类型_A星 墙体类型;

    public int 房间ID = 0;
    public string 房间MD5; //地面坐标长度(字符串)+墙体坐标长度(字符串)+地面坐标[0]+墙体坐标[0]
    public static int 房间ID计数 = 0;

    public 房间坐标类()
    {
        房间ID = 房间ID计数;
        房间ID计数++;
    }

    public bool 坐标是否属于房间(Vector2Int 坐标) => 地面坐标.Contains(坐标) || 墙体坐标.Contains(坐标);


    public Vector2Int 最近点墙壁(Vector2Int 起始)
    {
        float 距离 = float.MaxValue;
        Vector2Int? 返回 = null;
        foreach (var item in 墙体坐标)
        {
            float jl = Vector2Int.Distance(item, 起始);
            if (jl < 距离)
            {
                距离 = jl;
                返回 = item;
            }
        }
        return (Vector2Int)返回;
    }

    public void 移除房间(Dictionary<Vector2Int, 寻路节点_A星> 节点容器)
    {

        foreach (var item in 地面坐标)
            节点容器[item].所属房间 = null;
        foreach (var item in 墙体坐标)
            节点容器[item].所属房间 = null;
    }

    public bool 坐标是否属于房间(List<Vector2Int> 地面坐标)
    {
        foreach (var item in 地面坐标)
            if (this.地面坐标.Contains(item)) return true;
        return false;
    }

    public bool 是否有门(Dictionary<Vector2Int, 寻路节点_A星> 节点容器)
    {
        foreach (var item in 墙体坐标)
        {
            if (节点容器[item].格子类型 == 节点类型_A星.门)
                return true;
        }
        return false;
    }

    public 房间坐标类(int 房间ID)
    {
        if (房间ID > 房间ID计数)
        {
            this.房间ID = 房间ID;
            房间ID计数++;
        }
        else
        {
            this.房间ID = 房间ID计数;
            房间ID计数++;
        }
    }

    public 房间坐标类(List<Vector2Int> 地面坐标, List<Vector2Int> 墙体坐标)
    {
        this.地面坐标 = 地面坐标;
        this.墙体坐标 = 墙体坐标;
        房间ID = 房间ID计数;
        房间ID计数++;
        //房间MD5 = 凌依.工具库.MD5.md5_utf8(地面坐标.Count.ToString() + 墙体坐标.Count.ToString() + 地面坐标[0].ToString() + 墙体坐标[0].ToString());
    }
}

